package com.pkutech.carcasher.utils;

import com.pkutech.carcasher.model.PayCondition;
import com.pkutech.carcasher.model.Rate;
import java.math.BigDecimal;
import java.util.Date;

/**
 * Created by 柳勇 on 2016/7/7.
 */
public class BussinessUtil {
    public static long intervalMinites;
    /**
     当天内
     if（停车开始至结束时间是否在收费时段中）
     if（停车开始至结束时间在免费时长内）
     免费
     else if（计算时长在首小时内超过免费时长）
     按首小时金额收费，附加（等级打折，车位打折）
     else
     金额=首小时金额收费+（停车开始至结束时间-首小时，金额计算(方式：每半小时；每小时)，附加（等级打折，车位打折））

     if（金额超过封顶金额）
     按封顶金额收费
     if（停车开始时间是否在收费时段内）
     停车开始至收费时段（结束时间），金额计算(方式：每半小时；每小时)，附加（等级打折，车位打折）
     if （停车结束时间是否在收费时段内）
     收费时段（开始时间）至停车结束时间，金额计算(方式：每半小时；每小时)，附加（等级打折，车位打折）


     非当天内
     if（停车开始时间至结束时间>1天的倍数）
     按封顶金额收费*天数
     if(停车开始时间至结束时间>1天的倍数 and 有余数)
     按当天内方式计算
     * @param payCondition
     * @return
     */
    public static double calculatePay( PayCondition payCondition){
        //订单开始时间
        String startTime=payCondition.getStarttime();
        if (StringUtils.isNullOrEmpty(startTime)){
            return 0.0;
        }
        Date startTimetDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", startTime);
        // 订单结束时间
        String endTime = payCondition.getSysTime();
        if (StringUtils.isNullOrEmpty(endTime)){
            endTime=DateUtils.getNow();
//            return 0.0;
        }
        Date endTimeDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", endTime);

        // 收费时段开始时间
        String timeIntervalStart = payCondition.getRateDetail().getTimeintervalstart();
        if (StringUtils.isNullOrEmpty(timeIntervalStart)){
            return 0.0;
        }
        Date timeIntervalStartDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", timeIntervalStart);
        // 收费时段结束时间
        String timeIntervalEnd = payCondition.getRateDetail().getTimeintervalend();
        if (StringUtils.isNullOrEmpty(timeIntervalEnd)){
            timeIntervalEnd=payCondition.getSysTime();
        }
        Date timeIntervalEndDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", timeIntervalEnd);
        //按次收费
        if ("2".equals(payCondition.getRateDetail().getChargetype())){
            double fee_every= payCondition.getRateDetail().getTimemoney();
            //停车开始在当天（停车结束也一定会在当天）
            if(DateUtils.getDays(startTime,endTime,"yyyy-MM-dd")==0 && DateUtils.compareDate(startTimetDate,timeIntervalEndDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalStartDate)>0){
                if(checkWeekday(payCondition.getRateDetail(),startTime)){
                    return 0.0;
                }else {
                    return  fee_every;
                }
            }else{
                Long days=DateUtils.getDays(startTime,endTime,"yyyy-MM-dd");
                int realday=0;
                for (int i=0;i<=days;i++){
                    //第n天的收费时段开始
                    Date aftertimeIntervalStartDate=DateUtils.getAfterDate("yyyy-MM-dd HH:mm:ss", timeIntervalStartDate, i);
                    Date aftertimeIntervalEndDate=DateUtils.getAfterDate("yyyy-MM-dd HH:mm:ss", timeIntervalEndDate, i);
                    //第一天
                    if(i==0){
                        if(DateUtils.compareDate(startTimetDate,timeIntervalEndDate)<0 && !checkWeekday(payCondition.getRateDetail(),startTime)){
                            realday++;
                        }
                    }
                    if(i>0 && i<days &&  !checkWeekday(payCondition.getRateDetail(),DateUtils.format(aftertimeIntervalStartDate, "yyyy-MM-dd HH:mm:ss"))){
                        realday++;
                    }
                    //最后一天
                    if(i==days){
                        if(DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)>0 && !checkWeekday(payCondition.getRateDetail(),endTime)){
                            realday++;
                        }
                    }

                }
                return realday*fee_every;
            }
        }
        //免费时间 分钟
        double freeTime=payCondition.getRateDetail().getFreetime();
        //首几小时
        double firstTime =payCondition.getRateDetail().getFirsttime();

        //首几小时费用
        double fristTimeMoney=payCondition.getRateDetail().getFristtimemoney();
        //每几小时
        double everyHour=payCondition.getRateDetail().getEveryhour();
        ////每几小时费用
        double  everyHourMoney=payCondition.getRateDetail().getEveryhourmoney();

        //全天封顶金额
        double maxMoney=payCondition.getRateDetail().getMaxmoney();

        //实际收费开始时间=收费开始时间+免费时常
//	        Date real_timeIntervalStartDate= timeIntervalStartDate;
        //
//	        real_timeIntervalStartDate.setMinutes(real_timeIntervalStartDate.getMinutes()+freeTime);//给当前时间加50分钟后的时间

        double fee=0;
        double firstMin=firstTime*60;
        //停车开始在当天（停车结束也一定会在当天）
        if(DateUtils.getDays(startTime,endTime,"yyyy-MM-dd")==0){
            fee = calculatePayThisDay (payCondition);
        }
        //停车开始不在当天且肯定<当天 （但停车结束肯定在当天）
        else if(DateUtils.getDays(startTime,endTime,"yyyy-MM-dd")>0){
            Long intervalDays=DateUtils.getDays(startTime, endTime, "yyyy-MM-dd");

            //获取第一天的结束时间(开始时间不变)，计算第一天的费用
            payCondition.setEndtime(timeIntervalEnd);
            payCondition.setSysTime(timeIntervalEnd);
            double firstdayMoney=calculatePayThisDay(payCondition);
            if(firstdayMoney>maxMoney){
                firstdayMoney=maxMoney;
            }

            //计算除第一天外的费用(通过开业时间段计算)
            //计算中间天数
            Long days=DateUtils.getDays(startTime,endTime,"yyyy-MM-dd");
            int realday=0;
            for (int i=0;i<=days;i++){
                //第n天的收费时段开始
                Date aftertimeIntervalStartDate=DateUtils.getAfterDate("yyyy-MM-dd HH:mm:ss", timeIntervalStartDate, i);
                Date aftertimeIntervalEndDate=DateUtils.getAfterDate("yyyy-MM-dd HH:mm:ss", timeIntervalEndDate, i);
                if(i>0 && i<days &&  !checkWeekday(payCondition.getRateDetail(),DateUtils.format(aftertimeIntervalStartDate, "yyyy-MM-dd HH:mm:ss"))){
                    realday++;
                }
            }
            //计算每天费用
            double everydayMoney=0;
            if(intervalDays>1){
                //计算第二天的费用
                double everydayMin=DateUtils.getMinites(timeIntervalStart,timeIntervalEnd,"yyyy-MM-dd HH:mm:ss");
                double a=everydayMin/(everyHour*60);
                BigDecimal bg = new BigDecimal(a);
                double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
                if (everydayMin%(everyHour*60)!=0) {
                    f1=f1+1;
                }
                //
                everydayMoney=f1*everyHourMoney;
            }else {
                everydayMoney=0;
            }
            if(everydayMoney>maxMoney){
                everydayMoney=maxMoney;
            }

            //获取最后一天的费用
            String date1=DateUtils.getThisDate("yyyy-MM-dd HH:mm:ss", timeIntervalStartDate, intervalDays.intValue());
            String date2=DateUtils.getThisDate("yyyy-MM-dd HH:mm:ss", timeIntervalEndDate, intervalDays.intValue());
            payCondition.setStarttime(date1);
            payCondition.setEndtime(endTime);
            payCondition.setSysTime(endTime);

            payCondition.getRateDetail().setTimeintervalstart(date1);
            payCondition.getRateDetail().setTimeintervalend(date2);

            double lastdayMoney=calculatePayLastDay(payCondition);
            if(lastdayMoney>maxMoney){
                lastdayMoney=maxMoney;
            }
            fee=firstdayMoney+everydayMoney*realday+lastdayMoney;
        }
        BigDecimal bg = new BigDecimal(fee);
        double f1 = bg.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
        return f1;

    }

    /**
     * 获取第一天的费用
     * @param payCondition
     * @return
     */
    public static double calculatePayThisDay(PayCondition payCondition){

        // 收费时段开始时间
        String timeIntervalStart = payCondition.getRateDetail().getTimeintervalstart();
        if (StringUtils.isNullOrEmpty(timeIntervalStart)){
            return 0.0;
        }
        Date timeIntervalStartDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", timeIntervalStart);
        // 收费时段结束时间
        String timeIntervalEnd = payCondition.getRateDetail().getTimeintervalend();
        if (StringUtils.isNullOrEmpty(timeIntervalEnd)){
            timeIntervalEnd=payCondition.getSysTime();
        }
        Date timeIntervalEndDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", timeIntervalEnd);
        //订单开始时间
        String startTime=payCondition.getStarttime();
        if (StringUtils.isNullOrEmpty(startTime)){
            return 0.0;
        }
        Date startTimetDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", startTime);
        // 订单结束时间
        String endTime = payCondition.getSysTime();
        if (StringUtils.isNullOrEmpty(endTime)){
            endTime=DateUtils.getNow();
//            return 0.0;
        }
        Date endTimeDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", endTime);

        if(checkWeekday(payCondition.getRateDetail(),startTime)){
            return 0.0;
        }

        //免费时间 分钟
        double freeTime=payCondition.getRateDetail().getFreetime();
        //首几小时
        double firstTime =payCondition.getRateDetail().getFirsttime();

        //首几小时费用
        double fristTimeMoney=payCondition.getRateDetail().getFristtimemoney();
        //每几小时
        double everyHour=payCondition.getRateDetail().getEveryhour();
        ////每几小时费用
        double  everyHourMoney=payCondition.getRateDetail().getEveryhourmoney();

        //全天封顶金额
        double maxMoney=payCondition.getRateDetail().getMaxmoney();

        //实际收费开始时间=收费开始时间+免费时常
//	        Date real_timeIntervalStartDate= timeIntervalStartDate;
        //
//	        real_timeIntervalStartDate.setMinutes(real_timeIntervalStartDate.getMinutes()+freeTime);//给当前时间加50分钟后的时间

        double fee=0;
        double firstMin=firstTime*60;
        //停车开始在当天（停车结束也一定会在当天）
//        if(DateUtils.getDays(startTime,endTime)==0 || DateUtils.getDays(startTime,endTime)==1){
        //第二天的收费时段开始
        Date aftertimeIntervalStartDate=DateUtils.getAfterDate("yyyy-MM-dd HH:mm:ss", timeIntervalStartDate, 1);
        Date aftertimeIntervalEndDate=DateUtils.getAfterDate("yyyy-MM-dd HH:mm:ss", timeIntervalEndDate, 1);

        //1停车开始小于收费时段开始 且停车结束小于收费时段开始
        if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalStartDate)<0){
            //免费
            fee=0;
        }
        //2停车开始小于收费时段开始 且停车结束大于收费时段开始且小于收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalStartDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)<0){
            intervalMinites=DateUtils.getMinites(timeIntervalStart, endTime, "yyyy-MM-dd HH:mm:ss");
            if(intervalMinites>=freeTime){
                //超过首小时
                if (intervalMinites>firstMin){
                    double a=(intervalMinites-firstMin)/(everyHour*60);
                    BigDecimal bg = new BigDecimal(a);
                    double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
                    if ((intervalMinites-firstMin)%(everyHour*60)!=0) {
                        f1=f1+1;
                    }
                    //
                    fee=fristTimeMoney + f1*everyHourMoney;
                }else {
                    fee=fristTimeMoney;
                }
            }else {
                fee=0;
            }

        }
        //3停车开始大于收费时段开始 且停车结束小于收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)<0){
            intervalMinites=DateUtils.getMinites(startTime, endTime, "yyyy-MM-dd HH:mm:ss");
            if(intervalMinites>=freeTime){
                //超过首小时
                if (intervalMinites>firstMin){
                    double a=(intervalMinites-firstMin)/(everyHour*60);
                    BigDecimal bg = new BigDecimal(a);
                    double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
                    if ((intervalMinites-firstMin)%(everyHour*60)!=0) {
                        f1=f1+1;
                    }
                    //
                    fee=fristTimeMoney + f1*everyHourMoney;
                }else {
                    fee=fristTimeMoney;
                }
            }else {
                fee=0;
            }
        }

        //4停车开始大于收费时段开始 且停车开始小于收费时段结束  且停车结束大于收费时段结束 且停车结束小于第二天的收费时段开始
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)>0 && DateUtils.compareDate(startTimetDate,timeIntervalEndDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0
                && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)<0){
            intervalMinites=DateUtils.getMinites(startTime,timeIntervalEnd,"yyyy-MM-dd HH:mm:ss");
            if(intervalMinites>=freeTime){
                //超过首小时
                if (intervalMinites>firstMin){
                    //
                    double a=(intervalMinites-firstMin)/(everyHour*60);
                    BigDecimal bg = new BigDecimal(a);
                    double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
                    if ((intervalMinites-firstMin)%(everyHour*60)!=0) {
                        f1=f1+1;
                    }
                    //
                    fee=fristTimeMoney + f1*everyHourMoney;
                }else {
                    fee=fristTimeMoney;
                }
            }else {
                fee=0;
            }
        }
        //5 停车开始大于收费时段开始 且停车开始小于收费时段结束  且停车结束大于收费时段结束 且停车结束大于第二天的收费时段开始 且停车结束小于第二天的收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)>0 && DateUtils.compareDate(startTimetDate,timeIntervalEndDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0
                && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)>0 &&  DateUtils.compareDate(endTimeDate,aftertimeIntervalEndDate)<0){
            long intervalMinites1=DateUtils.getMinites(startTime,timeIntervalEnd,"yyyy-MM-dd HH:mm:ss");
            long intervalMinites2=DateUtils.getMinites(DateUtils.format(aftertimeIntervalStartDate, "yyyy-MM-dd HH:mm:ss"), endTime, "yyyy-MM-dd HH:mm:ss");
            intervalMinites=intervalMinites1+intervalMinites2;
            if(intervalMinites>=freeTime){
                //超过首小时
                if (intervalMinites>firstMin){
                    //
                    double a=(intervalMinites-firstMin)/(everyHour*60);
                    BigDecimal bg = new BigDecimal(a);
                    double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
                    if ((intervalMinites-firstMin)%(everyHour*60)!=0) {
                        f1=f1+1;
                    }
                    //
                    fee=fristTimeMoney + f1*everyHourMoney;
                }else {
                    fee=fristTimeMoney;
                }
            }else {
                fee=0;
            }
        }
        //6停车开始大于收费时段结束 且停车结束大于收费时段结束 且停车结束小于第二天收费时段开始
        else if(DateUtils.compareDate(startTimetDate,timeIntervalEndDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0 && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)<0){
            //如果结束时间在当天内 免费
            fee=0;
        }
        //7停车开始大于收费时段结束 且停车结束大于收费时段结束 且停车结束大于第二天收费时段开始 且停车结束小于第二天收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalEndDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0
                && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)>0 && DateUtils.compareDate(endTimeDate,aftertimeIntervalEndDate)<0){
            intervalMinites=DateUtils.getMinites(DateUtils.format(aftertimeIntervalStartDate, "yyyy-MM-dd HH:mm:ss"), timeIntervalEnd, "yyyy-MM-dd HH:mm:ss");

            double a=intervalMinites/(everyHour*60);
            BigDecimal bg = new BigDecimal(a);
            double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
            if (intervalMinites%(everyHour*60)!=0) {
                f1=f1+1;
            }
            //
            fee=f1*everyHourMoney;
        }
        //8停车开始大于收费时段结束 且停车结束大于收费时段结束 且停车结束大于第二天收费时段开始 且停车结束大于第二天收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalEndDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0
                && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)>0 && DateUtils.compareDate(endTimeDate,aftertimeIntervalEndDate)>0){
            intervalMinites=DateUtils.getMinites(DateUtils.format(aftertimeIntervalStartDate, "yyyy-MM-dd HH:mm:ss"), DateUtils.format(aftertimeIntervalEndDate, "yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss");

            double a=intervalMinites/(everyHour*60);
            BigDecimal bg = new BigDecimal(a);
            double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
            if (intervalMinites%(everyHour*60)!=0) {
                f1=f1+1;
            }
            //
            fee=f1*everyHourMoney;
        }
        //9 停车开始小于收费时段开始 且停车结束大于收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0){
            intervalMinites=DateUtils.getMinites(timeIntervalStart, endTime, "yyyy-MM-dd HH:mm:ss");
            if(intervalMinites>=freeTime){
                //超过首小时
                if (intervalMinites>firstMin){
                    double a=(intervalMinites-firstMin)/(everyHour*60);
                    BigDecimal bg = new BigDecimal(a);
                    double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
                    if ((intervalMinites-firstMin)%(everyHour*60)!=0) {
                        f1=f1+1;
                    }
                    //
                    fee=fristTimeMoney + f1*everyHourMoney;
                }else {
                    fee=fristTimeMoney;
                }
            }else {
                fee=0;
            }
        }
        //
        else{
            fee=0.0;
        }
        if (fee>maxMoney){
            fee=maxMoney;
        }

        BigDecimal bg = new BigDecimal(fee);
        double f1 = bg.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
        return f1;

    }



    /**
     * 获取最后一天的费用
     * @param payCondition
     * @return
     */
    public static double calculatePayLastDay(PayCondition payCondition){

        // 收费时段开始时间
        String timeIntervalStart = payCondition.getRateDetail().getTimeintervalstart();
        if (StringUtils.isNullOrEmpty(timeIntervalStart)){
            return 0.0;
        }
        Date timeIntervalStartDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", timeIntervalStart);
        // 收费时段结束时间
        String timeIntervalEnd = payCondition.getRateDetail().getTimeintervalend();
        if (StringUtils.isNullOrEmpty(timeIntervalEnd)){
            timeIntervalEnd=payCondition.getSysTime();
        }
        Date timeIntervalEndDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", timeIntervalEnd);
        //订单开始时间
        String startTime=payCondition.getStarttime();
        if (StringUtils.isNullOrEmpty(startTime)){
            return 0.0;
        }
        Date startTimetDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", startTime);
        // 订单结束时间
        String endTime = payCondition.getSysTime();
        if (StringUtils.isNullOrEmpty(endTime)){
            endTime=DateUtils.getNow();
//            return 0.0;
        }
        Date endTimeDate = DateUtils.parseDate("yyyy-MM-dd HH:mm:ss", endTime);



        if(checkWeekday(payCondition.getRateDetail(),startTime)){
            return 0.0;
        }

        //免费时间 分钟
        double freeTime=payCondition.getRateDetail().getFreetime();
        //首几小时
        double firstTime =payCondition.getRateDetail().getFirsttime();

        //首几小时费用
//        double fristTimeMoney=payCondition.getRateDetail().getFristtimemoney();
        //每几小时
        double everyHour=payCondition.getRateDetail().getEveryhour();
        ////每几小时费用
        double  everyHourMoney=payCondition.getRateDetail().getEveryhourmoney();

        //全天封顶金额
        double maxMoney=payCondition.getRateDetail().getMaxmoney();

        //实际收费开始时间=收费开始时间+免费时常
//	        Date real_timeIntervalStartDate= timeIntervalStartDate;
        //
//	        real_timeIntervalStartDate.setMinutes(real_timeIntervalStartDate.getMinutes()+freeTime);//给当前时间加50分钟后的时间

        double fee=0;
        double firstMin=firstTime*60;
        //停车开始在当天（停车结束也一定会在当天）
//        if(DateUtils.getDays(startTime,endTime)==0 || DateUtils.getDays(startTime,endTime)==1){
        //第二天的收费时段开始
        Date aftertimeIntervalStartDate=DateUtils.getAfterDate("yyyy-MM-dd HH:mm:ss", timeIntervalStartDate, 1);
        Date aftertimeIntervalEndDate=DateUtils.getAfterDate("yyyy-MM-dd HH:mm:ss", timeIntervalEndDate, 1);

        //1停车开始小于收费时段开始 且停车结束小于收费时段开始
        if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalStartDate)<0){
            //免费
            fee=0;
        }
        //2停车开始小于收费时段开始 且停车结束大于收费时段开始且小于收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalStartDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)<0){
            long intervalMinites=DateUtils.getMinites(timeIntervalStart, endTime, "yyyy-MM-dd HH:mm:ss");
            double a=intervalMinites/(everyHour*60);
            BigDecimal bg = new BigDecimal(a);
            double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
            if (intervalMinites%(everyHour*60)!=0) {
                f1=f1+1;
            }
            //
            fee=f1*everyHourMoney;

        }
        //3停车开始大于收费时段开始 且停车结束小于收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)<0){
            long intervalMinites=DateUtils.getMinites(startTime, endTime, "yyyy-MM-dd HH:mm:ss");
            double a=intervalMinites/(everyHour*60);
            BigDecimal bg = new BigDecimal(a);
            double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
            if (intervalMinites%(everyHour*60)!=0) {
                f1=f1+1;
            }
            //
            fee=f1*everyHourMoney;
        }

        //4停车开始大于收费时段开始 且停车开始小于收费时段结束  且停车结束大于收费时段结束 且停车结束小于第二天的收费时段开始
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)>0 && DateUtils.compareDate(startTimetDate,timeIntervalEndDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0
                && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)<0){
            long intervalMinites=DateUtils.getMinites(startTime,timeIntervalEnd,"yyyy-MM-dd HH:mm:ss");
            double a=intervalMinites/(everyHour*60);
            BigDecimal bg = new BigDecimal(a);
            double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
            if (intervalMinites%(everyHour*60)!=0) {
                f1=f1+1;
            }
            //
            fee=f1*everyHourMoney;
        }
        //5 停车开始大于收费时段开始 且停车开始小于收费时段结束  且停车结束大于收费时段结束 且停车结束大于第二天的收费时段开始 且停车结束小于第二天的收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)>0 && DateUtils.compareDate(startTimetDate,timeIntervalEndDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0
                && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)>0 &&  DateUtils.compareDate(endTimeDate,aftertimeIntervalEndDate)<0){
            long intervalMinites=DateUtils.getMinites(startTime,timeIntervalEnd,"yyyy-MM-dd HH:mm:ss");
            long intervalMinites2=DateUtils.getMinites(DateUtils.format(aftertimeIntervalStartDate, "yyyy-MM-dd HH:mm:ss"), endTime, "yyyy-MM-dd HH:mm:ss");
            intervalMinites=intervalMinites+intervalMinites2;
            double a=intervalMinites/(everyHour*60);
            BigDecimal bg = new BigDecimal(a);
            double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
            if (intervalMinites%(everyHour*60)!=0) {
                f1=f1+1;
            }
            //
            fee=f1*everyHourMoney;
        }
        //6停车开始大于收费时段结束 且停车结束大于收费时段结束 且停车结束小于第二天收费时段开始
        else if(DateUtils.compareDate(startTimetDate,timeIntervalEndDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0 && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)<0){
            //如果结束时间在当天内 免费
            fee=0;
        }
        //7停车开始大于收费时段结束 且停车结束大于收费时段结束 且停车结束大于第二天收费时段开始 且停车结束小于第二天收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalEndDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0
                && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)>0 && DateUtils.compareDate(endTimeDate,aftertimeIntervalEndDate)<0){
            long intervalMinites2=DateUtils.getMinites(DateUtils.format(aftertimeIntervalStartDate, "yyyy-MM-dd HH:mm:ss"), timeIntervalEnd, "yyyy-MM-dd HH:mm:ss");

            double a=intervalMinites2/(everyHour*60);
            BigDecimal bg = new BigDecimal(a);
            double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
            if (intervalMinites2%(everyHour*60)!=0) {
                f1=f1+1;
            }
            //
            fee=f1*everyHourMoney;
        }
        //8停车开始大于收费时段结束 且停车结束大于收费时段结束 且停车结束大于第二天收费时段开始 且停车结束大于第二天收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalEndDate)>0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0
                && DateUtils.compareDate(endTimeDate,aftertimeIntervalStartDate)>0 && DateUtils.compareDate(endTimeDate,aftertimeIntervalEndDate)>0){
            long intervalMinites2=DateUtils.getMinites(DateUtils.format(aftertimeIntervalStartDate, "yyyy-MM-dd HH:mm:ss"), DateUtils.format(aftertimeIntervalEndDate, "yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss");

            double a=intervalMinites2/(everyHour*60);
            BigDecimal bg = new BigDecimal(a);
            double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
            if (intervalMinites2%(everyHour*60)!=0) {
                f1=f1+1;
            }
            //
            fee=f1*everyHourMoney;
        }
        //9 停车开始小于收费时段开始 且停车结束大于收费时段结束
        else if(DateUtils.compareDate(startTimetDate,timeIntervalStartDate)<0 && DateUtils.compareDate(endTimeDate,timeIntervalEndDate)>0){
            long intervalMinites=DateUtils.getMinites(timeIntervalStart, endTime, "yyyy-MM-dd HH:mm:ss");
            double a=intervalMinites/(everyHour*60);
            BigDecimal bg = new BigDecimal(a);
            double f1 = bg.setScale(0, BigDecimal.ROUND_DOWN).doubleValue();
            if (intervalMinites%(everyHour*60)!=0) {
                f1=f1+1;
            }
            //
            fee=f1*everyHourMoney;
        }
        //10停车开始小于收费时段开始 且停车结束大于收费时段结束
        else{
            //最大值
            fee=maxMoney;
        }
        if (fee>maxMoney){
            fee=maxMoney;
        }
//        }
        BigDecimal bg = new BigDecimal(fee);
        double f1 = bg.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
        return f1;

    }
    //是否免费周期内  true 免费 false不免费
    public static boolean checkWeekday(Rate rate,String date){
        if(("0".equals(rate.getSunday())) && (DateUtils.getWeekday2(date)==1)){
            System.out.println("周天免费");
            return true;
        }
        else if(("0".equals(rate.getMonday())) && (DateUtils.getWeekday2(date)==2)){
            System.out.println("周一免费");
            return true;
        }
        else if(("0".equals(rate.getTuesday())) && (DateUtils.getWeekday2(date)==3)){
            System.out.println("周二免费");
            return true;
        }
        else if(("0".equals(rate.getWednesday())) && (DateUtils.getWeekday2(date)==4)){
            System.out.println("周三免费");
            return true;
        }
        else if(("0".equals(rate.getThursday())) && (DateUtils.getWeekday2(date)==5)){
            System.out.println("周四免费");
            return true;
        }
        else if(("0".equals(rate.getFriday())) && (DateUtils.getWeekday2(date)==6)){
            System.out.println("周五免费");
            return true;
        }
        else if(("0".equals(rate.getSaturday())) && (DateUtils.getWeekday2(date)==7)){
            System.out.println("周六免费");
            return true;
        }else{
            return  false;
        }
    }
}